#include "../include/Masque.h"

Masque::Masque(int _l,int _h) : largeur(_l),hauteur(_h)
{
	data = new GLubyte[largeur*hauteur];
	for(int i=0;i<largeur*hauteur;i++){
		data[i] = 0;
	}
	taillePinceau = 5;
}

Masque::~Masque(){
	delete []data;
}

GLubyte Masque::Lit(int x,int y){
	if (x < 0)
		x = -x;
	else if (x >= largeur)
		x = largeur*2 - 1 - x;
	if (y < 0)
		y = -y;
	else if (y >= hauteur)
		y = hauteur*2 -1 - y;
	return data[y*largeur + x];
}

GLubyte Masque::LitBool(int x,int y){
	if (x < 0)
		x = -x;
	else if (x >= largeur)
		x = largeur*2 - 1 - x;
	if (y < 0)
		y = -y;
	else if (y >= hauteur)
		y = hauteur*2 -1 - y;
	return data[y*largeur + x]/255;
}

void Masque::Ecrit(int _x,int _y,GLubyte _b){
	if(_x>=0&&_x<largeur&&_y>=0&&_y<hauteur)
		data[_y*largeur + _x] = _b;
}

void Masque::Dessine(int xa,int ya,int xb, int yb,int couleur){

	int x,y,dx,dy,incrmX,incrmY,dp,NE,SE;

	dx = xb-xa;
	dy = yb-ya;

	if (dx>0)
		incrmX = 1;
	else {
		incrmX = -1;
		dx *= -1;
	}

	if (dy>0)
		incrmY = 1;
	else {
		incrmY = -1;
		dy *= -1;
	}


	if (dx>=dy) {
		dp=2*dy-dx;
		SE=2*dy;
		NE=2*(dy-dx);

		y=ya;
		for(x=xa;x!=xb;x+=incrmX) {
			for(int i=x-taillePinceau;i<=x+taillePinceau;i++){
				for(int j=y-taillePinceau;j<=y+taillePinceau;j++){
					Ecrit(i,j,couleur);
				}
			}

			if (dp<=0)
				dp += SE;
			else {
				dp += NE;
				y+=incrmY;
			}
		}
	}
	else if (dx<dy) {
		dp=2*dx-dy;
		SE=2*dx;
		NE=2*(dx-dy);

		x=xa;
		for(y=ya;y!=yb;y+=incrmY) {
			for(int i=x-taillePinceau;i<=x+taillePinceau;i++){
				for(int j=y-taillePinceau;j<=y+taillePinceau;j++){
					Ecrit(i,j,couleur);
				}
			}

			if (dp<=0)
				dp += SE;
			else {
				dp += NE;
				x+=incrmX;
			}
		}
	}
	if(xa==xb && ya==yb)
		for(int i=x-taillePinceau;i<=x+taillePinceau;i++){
			for(int j=y-taillePinceau;j<=y+taillePinceau;j++){
				Ecrit(i,j,couleur);
			}
		}
}

void Masque::Effacer(){
	for(int i=0;i<largeur*hauteur;i++){
		data[i] = 0;
	}
}

void Masque::Afficher(){
	glDrawPixels(largeur, hauteur, GL_ALPHA, GL_UNSIGNED_BYTE, data) ;
}

void Masque::AffichePinceau(int x,int y){
	glBegin(GL_LINE_LOOP);
		glVertex2i(x-taillePinceau,y-taillePinceau);
		glVertex2i(x+taillePinceau,y-taillePinceau);
		glVertex2i(x+taillePinceau,y+taillePinceau);
		glVertex2i(x-taillePinceau,y+taillePinceau);
	glEnd();
}

void Masque::setTaillePinceau(int t){
	if(t>=0 && t<30)
		taillePinceau = t;
}
int Masque::getTaillePinceau(){
	return taillePinceau;
}
